// 四:手写实现MyPromise源码尽可能还原Promise中的每一个api,并通过注释的方式描述思路和原理




/**
 *  1. promise就是一个类，在执行这个类的时候，需要传递一个执行器进去，执行器会立即执行
 *  2. promise有三种状态，分别为成功(fulfilled), 失败(rejected), 等待中(pedding),状态一旦确定，就无法更改
 *  3. resolve, jecect函数是用来更改状态的
 *  4. then方法内部做的事情就是判断状态，如果状态是成功，调用成功的回调函数，如果是失败，调用失败的回调函数，then方法是被定义在原型对象中的
 *  5. then成功回调有一个参数，表示成功之后的值，then失败回调有一个参数，表示失败之后的原因
 *  6.then方法的链式调用，then的下一个then所接收的也是一个promise，此时应该new一个promise并返回
 *  7.有一种可能是自己返回自己，此时promise会进行无限回调，程序不允许，此判断加上
 *  8.对promise的执行器executor,.then,.catch,以及异步进行try catch 错误处理
 *  9.promsie.all方法的实现
 *  10.promsie.resolve方法的实现
 *  11.finally方法的实现
 *  12.catch方法的实现
 */

const MyPromise = require('./MyPromise.js')

 const promise = new MyPromise((resolve, reject) => {
     setTimeout(() => {
         resolve('成功')
        //  reject('失败 ....')
     }, 1000)
 })



function other () {
    return new MyPromise((resolve, reject) => {
        resolve('other')
    })
}

function p1() {
    return new MyPromise((resolve, reject) => {
        setTimeout(()=>{
        //    resolve('p1 resolve')
        reject('p1 reject')
        }, 2000)
    })
}

function p2() {
    return new MyPromise((resolve, reject) => {
        //    resolve('p2 resolve')
        reject('p2 reject')
    })
}



// MyPromise.all(['a','b', p1(), p2(), 'c']).then(result => console.log(result, 'xxxx'))

// MyPromise.resolve(p2()).then(res => console.log(res))
// MyPromise.resolve(10).then(res => console.log(res))


p2().finally(() => {
    console.log('finally')
    return p1()
}).then((res) => {
  console.log(res);
}).catch(reason => {
    console.log(reason);
})



//  let p1 = promise.then(res => {
//     console.log(res);
//     return p1
//  })
//  p1.then(res => {
//     console.log(res)
//  },err => {
//      console.log(444,err.message);
//  })
//  promise.then(res => {
//     console.log(res,'res');
//     return  new Error('xxx')
//  }, error => {
//      console.log(error.message,'error');
//      return 12
//  }).then(res => {
//      console.log(res);
//  })
//  promise.then(res => {
//     console.log(res,'res');
//  }, error => {
//      console.log(3);
//      console.log(error,'error');
//  })







